package com.zenithmind.mall.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 百亿补贴计算服务接口 - 遵循接口隔离原则，专门负责补贴计算逻辑
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
public interface SubsidyCalculationService {

    /**
     * 计算订单补贴金额
     * 
     * @param orderItems 订单项（商品ID -> 购买数量）
     * @param userId 用户ID
     * @return 补贴金额
     */
    BigDecimal calculateOrderSubsidy(Map<String, Integer> orderItems, String userId);

    /**
     * 计算单个商品的补贴金额
     * 
     * @param productId 商品ID
     * @param quantity 购买数量
     * @param userId 用户ID
     * @return 补贴金额
     */
    BigDecimal calculateProductSubsidy(String productId, Integer quantity, String userId);

    /**
     * 计算用户可享受的最大补贴金额
     * 
     * @param userId 用户ID
     * @param orderAmount 订单金额
     * @return 最大补贴金额
     */
    BigDecimal calculateMaxUserSubsidy(String userId, BigDecimal orderAmount);

    /**
     * 检查用户是否满足补贴条件
     * 
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 是否满足条件
     */
    Boolean checkUserSubsidyEligibility(String userId, String activityId);

    /**
     * 检查商品是否适用补贴
     * 
     * @param productId 商品ID
     * @param activityId 活动ID
     * @return 是否适用
     */
    Boolean checkProductSubsidyApplicability(String productId, String activityId);

    /**
     * 计算补贴后的商品价格
     * 
     * @param productId 商品ID
     * @param originalPrice 原价
     * @param userId 用户ID
     * @return 补贴后价格
     */
    BigDecimal calculateSubsidyPrice(String productId, BigDecimal originalPrice, String userId);

    /**
     * 获取用户已享受的补贴总额
     * 
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 已享受补贴总额
     */
    BigDecimal getUserTotalSubsidy(String userId, String activityId);

    /**
     * 获取用户剩余可享受补贴额度
     * 
     * @param userId 用户ID
     * @param activityId 活动ID
     * @return 剩余补贴额度
     */
    BigDecimal getUserRemainingSubsidy(String userId, String activityId);

    /**
     * 计算最优补贴方案
     * 
     * @param orderItems 订单项
     * @param userId 用户ID
     * @return 最优补贴方案
     */
    Object calculateOptimalSubsidyPlan(Map<String, Integer> orderItems, String userId);

    /**
     * 验证补贴计算结果
     * 
     * @param orderItems 订单项
     * @param userId 用户ID
     * @param calculatedSubsidy 计算的补贴金额
     * @return 验证结果
     */
    Boolean validateSubsidyCalculation(Map<String, Integer> orderItems, String userId, BigDecimal calculatedSubsidy);

    /**
     * 计算阶梯补贴金额
     * 
     * @param orderAmount 订单金额
     * @param activityId 活动ID
     * @return 阶梯补贴金额
     */
    BigDecimal calculateTieredSubsidy(BigDecimal orderAmount, String activityId);

    /**
     * 获取补贴计算明细
     * 
     * @param orderItems 订单项
     * @param userId 用户ID
     * @return 补贴计算明细
     */
    Object getSubsidyCalculationDetail(Map<String, Integer> orderItems, String userId);

    /**
     * 批量计算商品补贴
     * 
     * @param productIds 商品ID列表
     * @param userId 用户ID
     * @return 商品补贴映射（商品ID -> 补贴金额）
     */
    Map<String, BigDecimal> batchCalculateProductSubsidy(List<String> productIds, String userId);

    /**
     * 计算补贴活动的总成本
     * 
     * @param activityId 活动ID
     * @return 总成本
     */
    BigDecimal calculateActivityTotalCost(String activityId);

    /**
     * 预估订单补贴金额
     * 
     * @param orderItems 订单项
     * @param userId 用户ID
     * @return 预估补贴金额
     */
    BigDecimal estimateOrderSubsidy(Map<String, Integer> orderItems, String userId);
}
